package karaoke.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import karaoke.excepcion.DAOExcepcion;
import karaoke.modelo.Evento;
import karaoke.util.ConexionBD;

public class EventoDAO extends BaseDAO {

	public Evento insertar(Evento vo) throws DAOExcepcion {
		String query = "insert into Eventos(Nombre_Evento, Fecha_Evento, Hora_Evento, Aforo_Evento, Descripcion_Evento, Reserva_idReserva) values (?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNombre_Evento());
			stmt.setString(2, vo.getFecha_Evento());
			stmt.setString(3, vo.getHora_Evento());
			stmt.setInt(4, vo.getAforo_Evento());
			stmt.setString(5, vo.getDescripcion_Evento());
			stmt.setInt(6, vo.getReserva_idReserva());

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Evento actualizar(Evento vo) throws DAOExcepcion {
		String query = "update Eventos set Nombre_Evento=?,Fecha_Evento=?, Hora_Evento=?, Aforo_Evento=?,Descripcion_Evento=?,Reserva_idReserva=? where IdEvento=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			
			stmt.setString(1, vo.getNombre_Evento());
			stmt.setString(2, vo.getFecha_Evento());
			stmt.setString(3, vo.getHora_Evento());
			stmt.setInt(4, vo.getAforo_Evento());
			stmt.setString(5, vo.getDescripcion_Evento());
			stmt.setInt(6, vo.getReserva_idReserva());
			stmt.setInt(7, vo.getIdEvento());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void eliminar(int IdEvento) throws DAOExcepcion {
		String query = "delete from Eventos WHERE IdEvento=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, IdEvento);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Evento obtener(int IdEvento) throws DAOExcepcion {
		System.out.println("EventoDAO: obtener(int IdEvento)");
		Evento vo = new Evento();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select IdEvento, Nombre_Evento, Fecha_Evento, Hora_Evento, Aforo_Evento, Descripcion_Evento, Reserva_idReserva from eventos WHERE idEvento=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, IdEvento);
			rs = stmt.executeQuery();
			
			if (rs.next()) {
				vo.setIdEvento(rs.getInt(1));
				vo.setNombre_Evento(rs.getString(2));
				vo.setFecha_Evento(rs.getString(3));
				vo.setHora_Evento(rs.getString(4));
				vo.setAforo_Evento(rs.getInt(5));
				vo.setDescripcion_Evento(rs.getString(6));
				vo.setReserva_idReserva(rs.getInt(7));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Collection<Evento> buscarPorNombre(String nombreEvento)
			throws DAOExcepcion {
		String query = "SELECT IdEvento, Nombre_Evento, Fecha_Evento, Hora_Evento, Aforo_Evento, Descripcion_Evento, Reserva_idReserva FROM Eventos where Nombre_Evento like ?";
		Collection<Evento> lista = new ArrayList<Evento>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombreEvento + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Evento vo = new Evento();

				vo.setIdEvento(rs.getInt(1));
				vo.setNombre_Evento(rs.getString(2));
				vo.setFecha_Evento(rs.getString(3));
				vo.setHora_Evento(rs.getString(4));
				vo.setAforo_Evento(rs.getInt(5));
				vo.setDescripcion_Evento(rs.getString(6));
				vo.setReserva_idReserva(rs.getInt(7));
				
				vo.setIdEvento(rs.getInt("IdEvento"));
				vo.setNombre_Evento(rs.getString("Nombre_Evento"));
				vo.setFecha_Evento(rs.getString("Fecha_Evento"));
				vo.setHora_Evento(rs.getString("Hora_Evento"));
				vo.setAforo_Evento(rs.getInt("Aforo_Evento"));
				vo.setDescripcion_Evento(rs.getString("Descripcion_Evento"));
				vo.setReserva_idReserva(rs.getInt("Reserva_idReserva"));

				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(lista.size());
		return lista;
	}
}